freeslot(
"MT_ICESPRING", "SPR_ISRG", "S_ICESPRING", "S_ICESPRING2", "S_ICESPRING3", "S_ICESPRING4", "S_ICESPRING5", "S_ICESPRING6", "S_ICESPRING7", "S_ICESPRING8", 
"sfx_smwins", "MT_ICESHRAPNEL", "S_ICESHRAP", "S_ICESHRAP2", "S_ICESHRAP3", "S_ICESHRAP4", "SPR_ISHR"
)

mobjinfo[MT_ICESPRING] = {
		--$Name Ice Spring
		--$Sprite ISRGA0
		--$Category VoidyZones
		doomednum = 2355,
		spawnstate = S_ICESPRING,
		seestate = S_ICESPRING2,
		seesound = sfx_None,
		attacksound = sfx_None,
		painstate = S_NULL,
		painsound = sfx_s1cc,
		meleestate = S_NULL,
		missilestate = S_NULL,
		deathstate = S_NULL,
		xdeathstate = S_NULL,
		deathsound = sfx_None,
		activesound = sfx_smwins,
		raisestate = S_ICESPRING2,
		spawnhealth = 1000,
		reactiontime = 0,
		painchance = 10,
		speed = 0,
		radius = 20*FRACUNIT,
		height = 16*FRACUNIT,
		dispoffset = 0,
		mass = 17*FRACUNIT,
		damage = 0,
		flags = MF_SOLID|MF_SPRING
}

mobjinfo[MT_ICESHRAPNEL] = {
	doomednum = -1,
	spawnstate = S_ICESHRAP,
	height = 5*FRACUNIT,
	radius = 5*FRACUNIT,
	flags = MF_BOUNCE|MF_NOCLIPTHING
}

states[S_ICESPRING] = {SPR_ISRG, A, -1, nil, 0, 0, S_NULL}
states[S_ICESPRING2] = {SPR_ISRG, B, 4, A_Pain, 0, 0, S_ICESPRING3}
states[S_ICESPRING3] = {SPR_ISRG, C, 2, nil, 0, 0, S_ICESPRING4}
states[S_ICESPRING4] = {SPR_ISRG, D, 2, nil, 0, 0, S_ICESPRING5}
states[S_ICESPRING5] = {SPR_ISRG, E, 2, nil, 0, 0, S_ICESPRING6}
states[S_ICESPRING6] = {SPR_ISRG, F, 2, nil, 0, 0, S_ICESPRING7}
states[S_ICESPRING7] = {SPR_ISRG, G, 2, nil, 0, 0, S_ICESPRING8}
states[S_ICESPRING8] = {SPR_ISRG, H, 2, A_PlayActiveSound, 0, 0, S_INVISIBLE}

states[S_ICESHRAP] = {SPR_ISHR, A, -1, nil, 0, 0, S_NULL}
states[S_ICESHRAP2] = {SPR_ISHR, B, -1, nil, 0, 0, S_NULL}
states[S_ICESHRAP3] = {SPR_ISHR, C, -1, nil, 0, 0, S_NULL}
states[S_ICESHRAP4] = {SPR_ISHR, D, -1, nil, 0, 0, S_NULL}

addHook("MobjThinker", function(spring)
	if spring.state == S_INVISIBLE
		if not spring.SpawnedThem
			spring.flags = MF_NOGRAVITY
			local piece1 = P_SpawnMobj(spring.x, spring.y, spring.z, MT_ICESHRAPNEL)
			local piece2 = P_SpawnMobj(spring.x, spring.y, spring.z, MT_ICESHRAPNEL)
			local piece3 = P_SpawnMobj(spring.x, spring.y, spring.z, MT_ICESHRAPNEL)
			local piece4 = P_SpawnMobj(spring.x, spring.y, spring.z, MT_ICESHRAPNEL)			
			local piece5 = P_SpawnMobj(spring.x, spring.y, spring.z, MT_ICESHRAPNEL)
			local piece6 = P_SpawnMobj(spring.x, spring.y, spring.z, MT_ICESHRAPNEL)
			local piece7 = P_SpawnMobj(spring.x, spring.y, spring.z, MT_ICESHRAPNEL)
			local piece8 = P_SpawnMobj(spring.x, spring.y, spring.z, MT_ICESHRAPNEL)
			piece1.number = 1
			piece2.number = 2
			piece3.number = 3
			piece4.number = 4
			piece1.angle = spring.angle + (ANG1 * (P_RandomRange(-360, 360)))
			piece2.angle = spring.angle + (ANG1 * (P_RandomRange(-360, 360)))
			piece3.angle = spring.angle + (ANG1 * (P_RandomRange(-360, 360)))
			piece4.angle = spring.angle + (ANG1 * (P_RandomRange(-360, 360)))			
			piece5.number = 1
			piece6.number = 2
			piece7.number = 3
			piece8.number = 4
			piece5.angle = spring.angle + (ANG1 * (P_RandomRange(-360, 360)))
			piece6.angle = spring.angle + (ANG1 * (P_RandomRange(-360, 360)))
			piece7.angle = spring.angle + (ANG1 * (P_RandomRange(-360, 360)))
			piece8.angle = spring.angle + (ANG1 * (P_RandomRange(-360, 360)))
			spring.SpawnedThem = true
		end
		if spring.respawn
			spring.timerz = $ + 1
			if spring.timerz == mobjinfo[MT_ICESPRING].painchance*TICRATE
				spring.state = S_ICESPRING
				spring.flags = spring.DefaultFlags
				spring.timerz = 0
				spring.SpawnedThem = false
			end
		else
			P_RemoveMobj(spring)
		end
	end
end, MT_ICESPRING)

addHook("MapThingSpawn", function(spring, mapthing)	
	spring.respawn = true
	spring.timerz = 0
	spring.DefaultFlags = spring.flags
end, MT_ICESPRING)


addHook("MobjThinker", function(pieces)
	pieces.shadowscale = FRACUNIT
	local function RestoreState()
		if pieces.number == 1
			pieces.state = S_ICESHRAP
		elseif pieces.number == 2
			pieces.state = S_ICESHRAP2	
		elseif pieces.number == 3
			pieces.state = S_ICESHRAP3
		else
			pieces.state = S_ICESHRAP4
		end
	end
	if pieces.timer == nil
		RestoreState()
		pieces.timer = P_RandomRange(0, TICRATE)
		pieces.transstate = 0
		P_SetObjectMomZ(pieces, P_RandomRange(6, 12)*FRACUNIT, false)
		P_InstaThrust(pieces, pieces.angle, -FixedMul((P_RandomRange(5, 35)*FRACUNIT)/12 + FRACUNIT + P_RandomFixed(), pieces.scale))
	end
	if not P_IsObjectOnGround(pieces)
		pieces.rollangle = $ + FixedAngle(10<<FRACBITS)
	else
		pieces.rollangle = $ + FixedAngle(4<<FRACBITS)
	end
	pieces.timer = $ + 1	
	if (pieces.timer % 10) == 0
		pieces.transstate = $ + 1
	end
	if pieces.transstate == 1
		RestoreState()
		pieces.frame = $1 | TR_TRANS10
	elseif pieces.transstate == 2
		RestoreState()
		pieces.frame = $1 | TR_TRANS20
	elseif pieces.transstate == 3
		RestoreState()
		pieces.frame = $1 | TR_TRANS30
	elseif pieces.transstate == 4
		RestoreState()
		pieces.frame = $1 | TR_TRANS40
	elseif pieces.transstate == 5
		RestoreState()
		pieces.frame = $1 | TR_TRANS50
	elseif pieces.transstate == 6
		RestoreState()
		pieces.frame = $1 | TR_TRANS60
	elseif pieces.transstate == 7
		RestoreState()
		pieces.frame = $1 | TR_TRANS70
	elseif pieces.transstate == 8
		RestoreState()
		pieces.frame = $1 | TR_TRANS80
	elseif pieces.transstate == 9
		RestoreState()
		pieces.frame = $1 | TR_TRANS90
	elseif pieces.transstate >= 10
		P_RemoveMobj(pieces)
		return
	end
end, MT_ICESHRAPNEL)